home *** CD-ROM | disk | FTP | other *** search
/ Aminet 21 / Aminet 21 (1997)(GTI - Schatztruhe)[!][Oct 1997].iso / Aminet / dev / misc / gms_dev.lha / GMS / Source / Asm / Demos / Pobs.s < prev    next >
Encoding:
Text File  |  1997-07-08  |  9.3 KB  |  405 lines

  1. ;-------T-------T------------------------T----------------------------------;
  2. ;Name:      Pobs
  3. ;Author:    Paul Manias
  4. ;Copyright: DreamWorld Productions (c) 1996-1997.  Freely distributable.
  5. ;
  6. ;This demo originally came from the HowToCode series.
  7. ;
  8. ;This demo took just 15 minutes in being converted to a multi-tasking demo,
  9. ;there is no speed loss in run-time.
  10.  
  11.     INCDIR    "INCLUDES:"
  12.     INCLUDE    "games/games_lib.i"
  13.     INCLUDE    "games/games.i"
  14.  
  15. width    EQU    40
  16. height    EQU    256
  17.  
  18.     SECTION    "Pobs",CODE
  19.  
  20. ;==========================================================================;
  21. ;                             INITIALISE DEMO
  22. ;==========================================================================;
  23.  
  24.     STARTGMS
  25.  
  26. Start:    MOVEM.L    A0-A6/D1-D7,-(SP)
  27.     move.l    GMSBase(pc),a6
  28.     lea    ScreenTags(pc),a0
  29.     CALL    ShowScreen
  30.     tst.l    d0
  31.     beq.s    .Error_Screen
  32.  
  33.     bsr.s    Main
  34.  
  35. .ReturnToDOS
  36.     move.l    GMSBase(pc),a6
  37.     move.l    Screen(pc),a0
  38.     CALL    DeleteScreen
  39. .Error_Screen
  40.     MOVEM.L    (SP)+,A0-A6/D1-D7
  41.     moveq    #ERR_OK,d0
  42.     rts
  43.  
  44. ;==========================================================================;
  45. ;                                MAIN LOOP
  46. ;==========================================================================;
  47.  
  48. Main:    bsr.s    InPtabs
  49.     bsr.w    Rmasks
  50.  
  51. .loop    move.l    GMSBase(pc),a6
  52.     move.l    Screen(pc),a0
  53.     CALL    WaitVBL
  54.     CALL    SwapBuffers
  55.  
  56.     move.l    Screen(pc),a1    ;a1 = GameScreen
  57.     move.l    GS_Bitmap(a1),a0    ;a0 = Bitmap
  58.     move.l    GS_MemPtr3(a1),BMP_Data(a0)
  59.     CALL    ClearBitmap
  60.  
  61.     bsr.w    Calc
  62.     bsr.w    Put
  63.  
  64.     cmp.w    #293-1,number
  65.     beq.b    .mouse
  66.     addq.w    #1,number
  67.  
  68. .mouse    move.l    GMSBase(pc),a6
  69.     moveq    #JPORT1,d0
  70.     moveq    #JT_ZBXY,d1
  71.     CALL    ReadJoyPort
  72.     btst    #MB_LMB,d0
  73.     beq.s    .loop
  74.     rts
  75.  
  76. ;===========================================================================;
  77. ;                            SET UP POB TABLES
  78. ;===========================================================================;
  79.  
  80. InPtabs    lea    pob_xbuffer,a0    ;a0 = Ptr to XBuffer.
  81.     moveq    #$00,d0    ;d0 = 00.
  82. .xloop    move.w    d0,d1
  83.     and.w    #$000f,d1    ;d1 = $000x
  84.     lsl.w    #6,d1    ;d1 = <<6
  85.     move.w    d1,(a0)+    ;a0 = +d1
  86.     move.w    d0,d1
  87.     and.w    #$fff0,d1    ;d2 = $xxx0
  88.     ror.w    #3,d1    ;d2 = $?xxx
  89.     move.w    d1,(a0)+    ;a0 = +d2
  90.     addq.w    #1,d0    ;d0 = ++1
  91.     cmp.w    #width*8,d0    ;d0 > Is d0 == ScreenWidth?
  92.     bne.b    .xloop
  93.  
  94.     lea    pob_ybuffer,a0
  95.     moveq    #$00,d0
  96. .yloop    move.w    d0,d1
  97.     mulu    #width,d1
  98.     move.l    d1,(a0)+
  99.     addq.w    #1,d0
  100.     cmp.w    #height,d0
  101.     bne.b    .yloop
  102.     rts
  103.  
  104. ;===========================================================================;
  105. ;
  106. ;===========================================================================;
  107.  
  108. Rmasks:    moveq    #0,d7
  109.     lea    shape_buffer,a1
  110. .loop1    lea    pob_shape(pc),a0
  111.     move.w    #16,d6
  112. .loop2    move.l    (a0)+,d0
  113.     ror.l    d7,d0
  114.     move.l    d0,(a1)+
  115.     subq.w    #1,d6
  116.     bne.b    .loop2
  117.     addq.w    #1,d7
  118.     cmpi.w    #16,d7
  119.     bne.b    .loop1
  120.     rts
  121.  
  122. ;===========================================================================;
  123. ;                       ADJUST POB SCREEN POSITIONS
  124. ;===========================================================================;
  125.  
  126. Calc:    move.w    #$eeee,d0
  127.     move.w    #720,d6
  128.     lea    sinx_pointer1(pc),a0
  129.  
  130.     movem.l    (a0),a2/a3/a4/a5
  131.     movem.w    sinx_add1(pc),d2/d3/d4/d5
  132.  
  133.     add.w    d2,a2
  134.     cmp.w    (a2),d0
  135.     bne.s    .bkip1
  136.     sub.w    d6,a2
  137.  
  138. .bkip1    add.w    d3,a3
  139.     cmp.w    (a3),d0
  140.     bne.s    .bkip2
  141.     sub.w    d6,a3
  142.  
  143. .bkip2    add.w    d4,a4
  144.     cmp.w    (a4),d0
  145.     bne.s    .bkip3
  146.     sub.w    d6,a4
  147.  
  148. .bkip3    add.w    d5,a5
  149.     cmp.w    (a5),d0
  150.     bne.s    .bkip4
  151.     sub.w    d6,a5
  152.  
  153. .bkip4    movem.l    a2/a3/a4/a5,(a0)
  154.     lea    coord_stack,a0
  155.     movem.w    sinx_dist1(pc),d3-d4/a1/a6
  156.     move.w    d0,d5
  157.     move.w    number(pc),d7    ;d7 = Number of Pobs.
  158. .loop    add.w    d3,a2
  159.     add.w    d4,a3
  160.     cmp.w    (a2),d5
  161.     bne.s    .not_x1
  162.     sub.w    d6,a2
  163. .not_x1    cmp.w    (a3),d5
  164.     bne.s    .not_x2
  165.     suba.w    d6,a3
  166. .not_x2    move.w    (a2),d0
  167.     add.w    (a3),d0
  168.     add.w    a1,a4
  169.     add.w    a6,a5
  170.     cmp.w    (a4),d5
  171.     bne.b    .not_y1
  172.     sub.w    d6,a4
  173. .not_y1    cmp.w    (a5),d5
  174.     bne.b    .not_y2
  175.     sub.w    d6,a5
  176. .not_y2    move.w    (a4),d1
  177.     add.w    (a5),d1
  178.     move.w    d0,(a0)+
  179.     move.w    d1,(a0)+
  180.     dbf    d7,.loop
  181.     rts
  182.  
  183. ;===========================================================================;
  184. ;                          PLACE POBS ON SCREEN
  185. ;===========================================================================;
  186.  
  187. Put:    lea    pob_xbuffer,a0
  188.     lea    pob_ybuffer,a1
  189.     lea    shape_buffer,a4
  190.     move.l    Screen(pc),a6
  191.     move.l    GS_MemPtr2(a6),a6
  192.     lea    coord_stack,a5
  193.  
  194.     move.w    number(pc),d7
  195. .loop    movem.w    (a5)+,d0/d1    ;d0 = X, d1 = Y
  196.     add.w    d0,d0
  197.     add.w    d0,d0    ;d0 = (XCoord)*4
  198.     add.w    d1,d1
  199.     add.w    d1,d1    ;d1 = (YCoord)*4
  200.     move.l    (a0,d0.w),d0
  201.     lea    width(a6,d0.w),a3
  202.     add.l    (a1,d1.w),a3
  203.     swap    d0
  204.     lea    (a4,d0.w),a2
  205.     movem.l    (a2),d0-d5    ;d0..d5 = POB Gfx Data. 
  206.     or.l    d0,(a3)
  207.     or.l    d1,width(a3)
  208.     or.l    d2,width*2(a3)
  209.     or.l    d3,width*3(a3)
  210.     or.l    d4,width*4(a3)
  211.     or.l    d5,width*5(a3)
  212.     dbf    d7,.loop
  213.     rts
  214.  
  215. ;===========================================================================;
  216. ;
  217. ;===========================================================================;
  218.  
  219. sinx_pointer1:
  220.     dc.l    sin_xtab
  221. sinx_pointer2:
  222.     dc.l    sin_xtab
  223. siny_pointer1:
  224.     dc.l    sin_ytab
  225. siny_pointer2:
  226.     dc.l    sin_ytab
  227. sinx_add1:
  228.     dc.w    1*2    ;change values here to obtain
  229. sinx_add2:
  230.     dc.w    5*2    ;new patterns
  231. siny_add1:
  232.     dc.w    3*2
  233. siny_add2:
  234.     dc.w    2*2
  235. sinx_dist1:
  236.     dc.w    4*2
  237. sinx_dist2:
  238.     dc.w    3*2
  239. siny_dist1:
  240.     dc.w    1*2
  241. siny_dist2:
  242.     dc.w    2*2
  243. number:    dc.w    0            ;number of 'pobs'
  244.  
  245. sin_xtab:
  246.     dc.w    75,76,78,79,80,82,83,84
  247.     dc.w    85,87,88,89,91,92,93,94
  248.     dc.w    96,97,98,99,101,102,103,104
  249.     dc.w    106,107,108,109,110,111,112,114
  250.     dc.w    115,116,117,118,119,120,121,122
  251.     dc.w    123,124,125,126,127,128,129,130
  252.     dc.w    131,132,132,133,134,135,136,136
  253.     dc.w    137,138,139,139,140,141,141,142
  254.     dc.w    142,143,144,144,145,145,145,146
  255.     dc.w    146,147,147,147,148,148,148,149
  256.     dc.w    149,149,149,149,150,150,150,150
  257.     dc.w    150,150,150,150,150,150,150,150
  258.     dc.w    150,149,149,149,149,149,148,148
  259.     dc.w    148,147,147,147,146,146,145,145
  260.     dc.w    145,144,144,143,142,142,141,141
  261.     dc.w    140,139,139,138,137,136,136,135
  262.     dc.w    134,133,132,132,131,130,129,128
  263.     dc.w    127,126,125,124,123,122,121,120
  264.     dc.w    119,118,117,116,115,114,113,111
  265.     dc.w    110,109,108,107,106,104,103,102
  266.     dc.w    101,99,98,97,96,94,93,92
  267.     dc.w    91,89,88,87,85,84,83,82
  268.     dc.w    80,79,78,76,75,74,72,71
  269.     dc.w    70,68,67,66,65,63,62,61
  270.     dc.w    59,58,57,56,54,53,52,51
  271.     dc.w    49,48,47,46,44,43,42,41
  272.     dc.w    40,39,38,36,35,34,33,32
  273.     dc.w    31,30,29,28,27,26,25,24
  274.     dc.w    23,22,21,20,19,18,18,17
  275.     dc.w    16,15,14,14,13,12,11,11
  276.     dc.w    10,9,9,8,8,7,6,6
  277.     dc.w    5,5,5,4,4,3,3,3
  278.     dc.w    2,2,2,1,1,1,1,1
  279.     dc.w    0,0,0,0,0,0,0,0
  280.     dc.w    0,0,0,0,0,1,1,1
  281.     dc.w    1,1,2,2,2,3,3,3
  282.     dc.w    4,4,5,5,5,6,6,7
  283.     dc.w    8,8,9,9,10,11,11,12
  284.     dc.w    13,14,14,15,16,17,18,18
  285.     dc.w    19,20,21,22,23,24,25,26
  286.     dc.w    27,28,29,30,31,32,33,34
  287.     dc.w    35,36,37,39,40,41,42,43
  288.     dc.w    44,46,47,48,49,51,52,53
  289.     dc.w    54,56,57,58,59,61,62,63
  290.     dc.w    65,66,67,68,70,71,72,74
  291.     dc.w    75
  292.     dc.w    $eeee,$eeee,$eeee,$eeee
  293.     dc.w    $eeee,$eeee,$eeee,$eeee
  294.     dc.w    $eeee,$eeee,$eeee,$eeee
  295.     dc.w    $eeee,$eeee,$eeee,$eeee
  296.     dc.w    $eeee,$eeee,$eeee,$eeee
  297.     dc.w    $eeee,$eeee,$eeee,$eeee
  298.     dc.w    $eeee,$eeee,$eeee,$eeee
  299.     dc.w    $eeee,$eeee,$eeee,$eeee
  300.     dc.w    $eeee,$eeee,$eeee,$eeee
  301.     dc.w    $eeee,$eeee,$eeee,$eeee
  302.  
  303. sin_ytab:
  304.     dc.w    57,59,60,61,62,63,64,65
  305.     dc.w    66,66,67,68,69,70,71,72
  306.     dc.w    73,74,75,76,77,78,79,80
  307.     dc.w    81,82,83,84,84,85,86,87
  308.     dc.w    88,89,90,90,91,92,93,94
  309.     dc.w    94,95,96,97,97,98,99,100
  310.     dc.w    100,101,102,102,103,103,104,105
  311.     dc.w    105,106,106,107,107,108,108,109
  312.     dc.w    109,110,110,110,111,111,112,112
  313.     dc.w    112,112,113,113,113,114,114,114
  314.     dc.w    114,114,114,115,115,115,115,115
  315.     dc.w    115,115,115,115,115,115,115,115
  316.     dc.w    115,115,114,114,114,114,114,114
  317.     dc.w    113,113,113,112,112,112,112,111
  318.     dc.w    111,110,110,110,109,109,108,108
  319.     dc.w    107,107,106,106,105,105,104,103
  320.     dc.w    103,102,102,101,100,100,99,98
  321.     dc.w    97,97,96,95,94,94,93,92
  322.     dc.w    91,90,90,89,88,87,86,85
  323.     dc.w    84,84,83,82,81,80,79,78
  324.     dc.w    77,76,75,74,73,72,71,70
  325.     dc.w    69,68,67,66,66,65,64,63
  326.     dc.w    62,61,60,59,58,56,55,54
  327.     dc.w    53,52,51,50,49,49,48,47
  328.     dc.w    46,45,44,43,42,41,40,39
  329.     dc.w    38,37,36,35,34,33,32,31
  330.     dc.w    31,30,29,28,27,26,25,25
  331.     dc.w    24,23,22,21,21,20,19,18
  332.     dc.w    18,17,16,15,15,14,13,13
  333.     dc.w    12,12,11,10,10,9,9,8
  334.     dc.w    8,7,7,6,6,5,5,5
  335.     dc.w    4,4,3,3,3,3,2,2
  336.     dc.w    2,1,1,1,1,1,1,0
  337.     dc.w    0,0,0,0,0,0,0,0
  338.     dc.w    0,0,0,0,0,0,1,1
  339.     dc.w    1,1,1,1,2,2,2,3
  340.     dc.w    3,3,3,4,4,5,5,5
  341.     dc.w    6,6,7,7,8,8,9,9
  342.     dc.w    10,10,11,12,12,13,13,14
  343.     dc.w    15,15,16,17,18,18,19,20
  344.     dc.w    21,21,22,23,24,25,25,26
  345.     dc.w    27,28,29,30,31,31,32,33
  346.     dc.w    34,35,36,37,38,39,40,41
  347.     dc.w    42,43,44,45,46,47,48,49
  348.     dc.w    49,50,51,52,53,54,55,56
  349.     dc.w    57
  350.     dc.w    $eeee,$eeee,$eeee,$eeee
  351.     dc.w    $eeee,$eeee,$eeee,$eeee
  352.     dc.w    $eeee,$eeee,$eeee,$eeee
  353.     dc.w    $eeee,$eeee,$eeee,$eeee
  354.     dc.w    $eeee,$eeee,$eeee,$eeee
  355.     dc.w    $eeee,$eeee,$eeee,$eeee
  356.     dc.w    $eeee,$eeee,$eeee,$eeee
  357.     dc.w    $eeee,$eeee,$eeee,$eeee
  358.     dc.w    $eeee,$eeee,$eeee,$eeee
  359.     dc.w    $eeee,$eeee,$eeee,$eeee
  360.  
  361. pob_shape:
  362.     dc.w    %0000000110000000,0
  363.     dc.w    %0000000110000000,0
  364.     dc.w    %0000011111100000,0
  365.     dc.w    %0000011111100000,0
  366.     dc.w    %0000000110000000,0
  367.     dc.w    %0000000110000000,0
  368.  
  369. ;===========================================================================;
  370. ;                                  DATA
  371. ;===========================================================================;
  372.  
  373. ScreenTags:
  374.     dc.l    TAGS_GAMESCREEN
  375. Screen:    dc.l    0
  376.     dc.l    GSA_MemPtr1,ScreenMem
  377.     dc.l    GSA_MemPtr2,ScreenMem+height*width
  378.     dc.l    GSA_MemPtr3,ScreenMem+height*width*2
  379.     dc.l    GSA_Palette,.palette
  380.     dc.l    GSA_ScrWidth,320
  381.     dc.l    GSA_ScrHeight,256
  382.     dc.l    GSA_Planes,1
  383.     dc.l    GSA_Attrib,TPLBUFFER
  384.     dc.l    GSA_ScrType,PLANAR
  385.     dc.l    TAGEND
  386. .palette
  387.     dc.l    $00000000,$00f0f000
  388.  
  389. ;===========================================================================;
  390.  
  391.     SECTION    Screens,BSS_C
  392.  
  393. ScreenMem:
  394.     ds.b    (height*width*3)+(width*50)
  395.  
  396. shape_buffer:
  397.     ds.l    256
  398. pob_xbuffer:
  399.     ds.l    (width*8)
  400. pob_ybuffer:
  401.     ds.l    height
  402.  
  403. coord_stack:
  404.     ds.l    1500
  405.